////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2011-2012 www.iflytek.com. All Rights Reserved.
//  This software for customer relationship management system, developed by Noo team.
//  Software code and design for the team, copy rights reserved.
////////////////////////////////////////////////////////////////////////////////

package com.iflytek.ci.cpms.service;

import com.iflytek.ci.cpms.domain.Project;
import com.iflytek.ci.cpms.dto.ProjectInformation;
import com.iflytek.framework.pagination.PaginationCriteria;
import com.iflytek.framework.pagination.PaginationResult;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.Map;

/**
 * <p>
 * 项目配置服务接口.
 * </p>
 *
 * @author poplar.yfyang
 * @version 1.0 2012-10-30 10:34 AM
 * @since JDK 1.5
 */
public interface ProjectService {

	/**
	 * 分页查询所有的项目信息
	 *
	 * @param criteria 分页信息
	 * @return 项目信息，分页显示
	 */
	PaginationResult<Project> find_project(PaginationCriteria criteria);

	/**
	 * 查询项目信息，可以按项目名称和项目KEY来进行查询
	 *
	 * @param criteria 分页信息
	 * @param params   参数信息，查询条件。Map中的KEY如下
	 *                 NAME:项目名称
	 *                 KEY：项目标志
	 * @return 符合查询条件的项目信息
	 */
	PaginationResult<Project> search_project(PaginationCriteria criteria, Map<String, Object> params);

	/**
	 * 根据项目名或者项目的key查找项目
	 *
	 * @param criteria 分页参数
	 * @param search   查询条件
	 * @return 项目列表
	 */
	PaginationResult<Project> fuzzySearchProjects(PaginationCriteria criteria, String search);

	/**
	 * 根据项目的key查找项目
	 *
	 * @param key 项目key
	 * @return 项目列表
	 */
	List<Project> fuzzySearchProjects(String key);

	/**
	 * 根据ID获取项目信息
	 *
	 * @param id 项目ID
	 * @return 项目信息
	 */
	Project fromId(long id);

    /**
     * 根据ID获取项目的基本信息、成员信息、里程碑信息
     *
     * @param pid  项目id
     * @return
     */
	ProjectInformation getProjectInformation(long pid);
	/**
	 * 添加项目信息
	 *
	 * @param project 项目信息
	 * @param team_account_ids 项目团队成员的用户ID
	 */
	void add_project(Project project, long[] team_account_ids, String basePath,String realPath);

	/**
	 * 修改项目信息
	 *
	 * @param project 项目信息
	 * @param team_account_ids 项目团队成员的用户ID
	 */
	void update_project(Project project, long[] team_account_ids);

	/**
	 * 指派指定的人员为某个项目的负责人
	 *
	 * @param project_id 项目ID
	 * @param lead       项目负责人ID
	 */
	void assign_lead(long project_id, String lead);

	/**
	 * 指派项目的开发团队
	 *
	 * @param project_id 项目ID
	 * @param team_id    团队ID
	 */
	void assign_team(long project_id, long team_id);

	/**
	 * 删除一个或者多个项目
	 *
	 * @param project_ids 一个或者多个项目ID
	 * @return true表示删除成功
	 */
	boolean remove_project(String[] project_ids);

    /**
     * 根据项目的key查找某个项目
     *
     * @param pkey  项目key
     * @return   项目信息
     */
	Project fromKey(String pkey);


	/**
	 * 所有的项目信息
	 *
	 * @return 所有项目
	 */
	List<Project> all_projects();

	/**
	 * 根据id或者key查询项目信息
	 *
	 * @param params Map key
	 *               p_key:项目code
	 *               id:项目id
	 * @return Project 信息
	 */
	Project get_project(Map<String, Object> params);

    /**
     * 根据多个项目id得到这多个项目信息
     *
     * @param  ids 多个项目的id
     * @return 项目列表
     */
    List<Project> projects_with_ids(String [] ids);
    
    /**
     * 根据milestone_id查询相关的team，project，milestone信息
     *
     * @param milestone_id 里程碑id
     * @return
     */
    ProjectInformation get_info_milestone_id(long milestone_id);

    /**
     * 为某个项目导入账户信息
     *
     * @param pid  项目id
     * @param upload_file 导入的账户信息文件
     */
    void import_account(long pid,MultipartFile upload_file);

    /**
     * 获取当前登录人所在项目和领导的项目 、
     *
     * @return  项目列表
     */
    List<Project>get_project();
}
